//Source file: C:\\javier\\mario\\Java\\taladro\\control\\AdminInstrucciones.java

package taladro.control;

import taladro.instrucciones.evento.InstruccionListener;
import taladro.proyecto.Proyecto;
import taladro.instrucciones.Instruccion;
import java.util.Vector;
import taladro.maquina.Maquina;

public class AdminInstrucciones implements InstruccionListener 
{
   int indexInstruc = 0;
   protected Vector listeners;
   Thread procInst;
   Maquina maquina;
   protected Vector instrucciones;
   public Proyecto theProyecto;
   
   /**
    * @roseuid 3F3838CE02C6
    */
   public AdminInstrucciones() 
   {
       instrucciones = new Vector();
       listeners = new Vector();
   }
   
   /**
    * @param listener
    * @roseuid 3F3828D50208
    */
   public void addInstruccionListener(InstruccionListener listener) 
   {
        this.listeners.add(listener);    
   }
   
   /**
    * @roseuid 3F3828F2011A
    */
   public void removeListeners() 
   {
        this.listeners.clear();    
   }
   
   /**
    * @param listener
    * @roseuid 3F38290A0196
    */
   public void removeListener(InstruccionListener listener) 
   {
        listeners.remove(listener);    
   }
   
   /**
    * @param instruccion
    * @roseuid 3F382AA701D6
    */
   public void addInstruccion(Instruccion instruccion) 
   {
        instrucciones.add(instruccion);    
   }
   
   /**
    * @return taladro.instrucciones.Instruccion
    * @roseuid 3F382AC0025E
    */
   public Instruccion getInstruccionActual() 
   {
       if( instrucciones.size() == 0 || indexInstruc >= instrucciones.size() )
           return null;
    return (Instruccion) instrucciones.elementAt(indexInstruc);    
   }
   
   /**
    * @return taladro.instrucciones.Instruccion
    * @roseuid 3F382B3403C4
    */
   public Instruccion getInstruccionSiguiente() 
   {
       if( indexInstruc < instrucciones.size() )
           return (Instruccion) instrucciones.elementAt(indexInstruc++);
       return null;    
   }
   
   /**
    * @param index
    * @roseuid 3F382B46009E
    */
   public void setInstruccionActual(int index) 
   {
        indexInstruc = index;    
   }
   
   /**
    * @return Instruccion[]
    * @roseuid 3F382B6201D5
    */
   public Instruccion[] getInstrucciones() 
   {
    return (Instruccion[]) instrucciones.toArray();    
   }
   
   public Vector getVectorInstrucciones() 
   {
    return instrucciones;
   }
   
   /**
    * @roseuid 3F3837850179
    */
   public void ejecutarInstruccion() 
   {
        Instruccion inst = getInstruccionSiguiente();
        
        if( inst == null )
            return;
        
        inst.setMaquina(maquina);
        inst.setListener(this);
        
        procInst = new Thread(inst, "instruccion" + indexInstruc);
        procInst.start();
   }
   
   /**
    * @throws java.lang.SecurityException
    * @roseuid 3F38378E0063
    */
   public void cancelarInstruccion() throws SecurityException 
   {
        procInst.interrupt();    
   }
   
   /**
    * @roseuid 3F386F430033
    */
   public void instEjecutada() 
   {
        for( int i=0 ; i < listeners.size(); i++ )
        {
            InstruccionListener listener = (InstruccionListener)listeners.elementAt(i);
            listener.instEjecutada();
        }    
   }
   
   /**
    * @roseuid 3F386F43005B
    */
   public void instCancelada() 
   {
       for( int i=0 ; i < listeners.size(); i++ )
        {
            InstruccionListener listener = (InstruccionListener)listeners.elementAt(i);
            listener.instCancelada();
        }    
   }
   
   /**
    * @param instruccion
    * @roseuid 3F386F430083
    */
   public void ejecutandoInst(Instruccion instruccion) 
   {
        for( int i=0 ; i < listeners.size(); i++ )
        {
            InstruccionListener listener = (InstruccionListener)listeners.elementAt(i);
            listener.ejecutandoInst(instruccion);
        }    
   }
   
   /**
    * @param maquina
    * @roseuid 3F39FF1D01E1
    */
   public void setMaquina(Maquina maquina) 
   {
       this.maquina = maquina;    
   }
   
   /**
    * @return int
    * @roseuid 3F40539A02E5
    */
   public int getIndexInstActual() 
   {
    return indexInstruc;
   }
   
   public int getTotalInstrucciones(){
       return instrucciones.size();
   }
   
   public void clearInst(){
       instrucciones.clear();
       setInstruccionActual(0);
   }
   
   public boolean isEnd(){
       if( getInstruccionActual() == null ) 
           return true;
       return false;       
   }
}
/**
 * 
 * 
 * 
 *
 *  
 *  
 *  
 */
